场景:大促凌晨订单接口 TPS 掉到 10%,监控显示 FGC 每 30 秒一次。
步骤:
打开 GC 日志:
-Xlog:gc*(JDK11)在线
jstat -gcutil pid 1s→ Old 区 99%、FGC 计数狂飙jmap -dump:live,format=b,file=heap.hprofMAT 打开 → Histogram 发现
com.xxx.OrderDTO占 1.8 G代码定位:查询订单列表时一次性把 30 天数据全塞到 List,没有做分页。
优化:
• 分页查询 + 流式处理(MyBatis Cursor)
• 调整-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200
结果:Old 区降到 30%,FGC 消失,接口 TPS 恢复到 3000+。